#!/bin/bash

# add_users_to_group.sh
# 功能说明:
# 1. 将用户批量添加到指定用户组。
# 2. 支持通过命令行直接传入用户名，或者通过文件读取用户名列表（包含用户名和密码）。
# 3. 自动忽略文件中的密码字段，仅使用用户名。
# 4. 如果用户或用户组不存在，脚本会给出提示并跳过。
# 5. 如果用户组不存在，脚本会自动创建用户组。
# 6. 确保所有需要管理员权限的命令都通过 sudo 执行。

# 检查并创建用户组
check_and_create_group() {
  local group="$1"
  if ! getent group "$group" &>/dev/null; then
    echo "Group $group does not exist. Creating it now..."
    sudo groupadd "$group"
    if [[ $? -eq 0 ]]; then
      echo "Group $group has been created successfully."
    else
      echo "Failed to create group $group."
      exit 1
    fi
  else
    echo "Group $group already exists."
  fi
}

# 将用户添加到组的函数
add_user_to_group() {
  local username="$1"
  local group="$2"

  # 检查用户是否存在
  if id "$username" &>/dev/null; then
    # 检查用户是否已在组中
    if id -nG "$username" | grep -qw "$group"; then
      echo "User $username is already in group $group. Skipping..."
    else
      sudo usermod -aG "$group" "$username"
      if [[ $? -eq 0 ]]; then
        echo "User $username has been successfully added to group $group."
      else
        echo "Failed to add user $username to group $group."
      fi
    fi
  else
    echo "User $username does not exist. Skipping..."
  fi
}

# 从文件处理用户的函数
process_file() {
  local file="$1"
  local group="$2"

  # 检查文件是否存在
  if [[ ! -f "$file" ]]; then
    echo "File $file does not exist. Please provide a valid file."
    exit 1
  fi

  # 逐行读取文件内容并添加用户到组
  while IFS= read -r line; do
    # 跳过空行和注释行
    [[ -z "$line" || "$line" == \#* ]] && continue

    # 提取用户名，忽略密码字段
    local username=$(echo "$line" | awk '{print $1}')
    add_user_to_group "$username" "$group"
  done < "$file"
}

# 主函数
main() {
  if [[ $# -lt 2 ]]; then
    echo "Usage: $0 <group_name> [-f user_file | username1 username2 ...]"
    exit 1
  fi

  # 获取用户组名称
  local group="$1"
  shift

  # 检查并创建用户组
  check_and_create_group "$group"

  # 处理命令行参数
  case "$1" in
    -f|--file)
      shift
      if [[ -n "$1" ]]; then
        process_file "$1" "$group"
      else
        echo "Error: Missing file name after -f."
        exit 1
      fi
      ;;
    *)
      # 处理直接传入的用户名
      for username in "$@"; do
        add_user_to_group "$username" "$group"
      done
      ;;
  esac
}

# 执行主函数
main "$@"

